﻿// demo02.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>     // std::cout
#include <algorithm>    // std::find_if
#include <vector>       // std::vector
using namespace std;
//自定义一元谓词函数
bool mycomp(int i) {
    return ((i % 2) == 1);
}
//以函数对象的形式定义一个 find_if() 函数的查找规则
class mycomp2 {
public:
    bool operator()(const int& i) {
        return ((i % 2) == 1);
    }
};


void demo01()
{
    vector<int> myvector{ 4,2,3,1,5,6,7,9 };
    //调用 find_if() 函数，并以 IsOdd() 一元谓词函数作为查找规则
    vector<int>::iterator it = find_if(myvector.begin(), myvector.end(), mycomp2());
    while (it != myvector.end()) {
        cout << "*it = " << *it << endl;
        myvector.erase(it);
        // erase 会删掉 it,导致it的值指向一个null（it不是null）。这个时候打印的话，会异常。
        it = find_if(myvector.begin(), myvector.end(), mycomp2());
    }
}

void demo02()
{
    std::vector<int> myvector{ 1,2,3,4,5,6,7,8,9 };
    std::vector<int>::iterator bound;
    //以 mycomp2 规则，对 myvector 容器中的数据进行分组
    bound = std::stable_partition(myvector.begin(), myvector.end(), mycomp2());
    for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
        cout << *it << " ";
    }
    cout << "\nbound = " << *bound;
}

void demo03()
{
    std::vector<int> my{ 1,2,3,4,5,6,7,8,9 };
    std::vector<int>::reverse_iterator x;
    x = my.rend(); // 返回一个逆序迭代器，它指向容器c的第一个元素前面的位置
	// 所以 x-1 就是第一个元素 即 1
	// 所以 x-2 就是第二个元素 即 2
    for (int i = 1; i < 10; i++) {
        std::cout << *(x - i) << " " << std::endl;
    }
    std::cout << std::endl;
}

int main() {
    demo01();
    return 0;
}

